Conversation
Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
A seat took its turn holding one conversation: the desk in front of it. An agent seated on two desks, or holding its own direct line, answered on one of them knowing nothing of the others — and re-seeded rather than remembered, because `SharingState` is a single conversation and a single watermark. This gives every speaker its *other* conversations in its prompt: each desk it also sits on, and its own direct line, each already projected for it. Four constraints shape it, and each is load-bearing: **Projected as the speaker, never as the operator.** `Viewer::Agent`, so an aside it is not in arrives elided here exactly as it would at home. Passing `Viewer::Operator` would hand a seat every private row in the company. **Out of the fold.** `step` still folds only the deliberating conversation, so a row from elsewhere can be quoted and can never move an option towards a decision. Information crosses a boundary; support does not — the same bargain an aside strikes and a referral's answer strikes. **The deliberating desk is excluded from the load.** It comes from `project_for`, not from this. Loading it in full would re-insert the peer rows a blind round withheld while quorum kept counting as though independence held: the appearance of it with none of the property, which is worse than not having it. **Per conversation, never merged.** Two desks number their rows independently, so a merged `[7]` would name two different messages. `company_desks` is split out of `desk_federation` because that gates on the home desk's referral opt-in, and whether a seat may *ask* another desk a question is not the same permission as whether it can already *read* a desk it sits on. Unset renders nothing, including no read of the direct line, so every caller that existed before is byte-identical.
Add coverage for the finance company switching behavior to verify it works as expected. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
A seat writes its move and may add one `!aside @peer` line beneath it. The host journals that line as its own row carrying an `audience`, and the projection had no way to tell it from an ordinary reply — so it reached the operator's transcript verbatim, `!aside @refunds` and all, addressed to a room it was never addressed to. Two defects in one row, and they need different fixes. **The grammar leaked.** `MOVE_KINDS` deliberately omits `aside` — a marker the fold discards is not a move anybody made — so `line_kind` returns `None` and `readable_moves` leaves the head in the body. The strip lives here instead, and takes every leading `@name` rather than the first, since a desk may raise `max_members`. **The row read as the room's own voice.** Aside rows are now lifted out of the transcript and hung on the nearest preceding desk-visible row *by the same author* — the move they rode under. By author rather than adjacency: two seats asiding in one round would otherwise cross. An orphan — no move above it, a page that begins mid-exchange — is kept as an ordinary row, matching the rule the referral fold already states one function below: a line in the wrong shape beats a line nobody can read. The console renders it as `ReferralConversation`'s sibling, collapsed, `aside @Refunds · 1 message`, dashed where a referral's border is solid. **The collapse is tidiness, not access control**, and that is the one thing not to copy from the referral. A referral's rows are dropped host-side, so expanding is the only way to read them at all. An aside is withheld from *agents* outside it and never from a person — `Audience::admits` admits every operator unconditionally, because privacy here is a deliberation device and not a security boundary. Expanding reveals nothing the reader was not already entitled to. `an_aside_reaches_the_operator_as_a_collapsed_conversation` covers the seam: a real episode writes an aside, and the operator gets it folded. Both halves were already tested — that asides are journaled with an audience, and that the fold groups such rows — and neither noticed that nothing joined them, which is exactly where the leak lived.
Two bundle changes, both made to exercise the aside path end to end. **Asides on all three desks.** `AsidePolicy::DEFAULT` permits nothing — deliberately, because the mechanism does not get the benefit of the doubt — so a desk that wants one says so. Bounds are left at their defaults: a pair (`max_members = 1`, excluding the author), two rows (a question and an answer), and `must_surface`, which makes a pair deposit one desk-visible line before opening another. Widening them would turn an aside into what the spec calls a second desk with no quorum and no record. **`triage` joins `returns`.** Nine read tools and no mutating one, so it is a checker rather than a third competing remedy. On two seats an aside was the whole room minus one, and the elision stub had no reader to be a stub for; with three, an outsider exists and the collapse means something. `tau2-sim.py` moves in step because `--check` asserts desk membership exactly. Measured, and worth recording honestly: this did not make asides frequent. Across seven runs of task 0 exactly one seat wrote an aside, unbidden, and it was the narrow case the mechanism is for — a seat that could swap items but held no refund tool asking the seat that did. Every deliberate attempt failed, including a seat writing a dictated line that was then discarded because addressing one agent is a responder turn and not an episode. Rooms coordinate tool boundaries in the open, which is what `must_surface` and the prompt both push them towards.
Add unit coverage for escaping an onboarding gate that becomes stuck, ensuring users can continue navigating when the gate cannot complete. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Every seat's hand-off block carried two defects that failed silently. **The mention form was wrong.** The block said `@returns`, and a desk is addressed as `@#returns` — the `@#` form resolves to a desk and cannot be shadowed by a teammate who happens to share the name. A bare mention resolves to nothing and reaches nobody, so the hand-off was dropped with no error and the work never happened. **Two seats named their own desk.** `exchanges` and `refunds` sit on `returns` and were told to write `@returns`, copied from the `order_ops` seats without changing the target. That is a self-desk referral, and `delegates_to` authorises only `order_ops` in any case, so both were refused — silently — and no case ever crossed from returns to order operations. **The block also misdescribed what a referral is.** It promised the far desk's seats would deliberate the question between them and return what the room settled on. A referral is at most one turn: one teammate on that desk answers, and what comes back is one colleague's reading, on the record, for the asker to weigh. It is information and not a vote — it supports nothing here until a seat spends a line acting on it. `triage` now routes on order status and nothing else: `@#order_ops` for pending, `@#returns` for delivered. The README's credential example gains the `models` map. The paragraph directly beneath it already warned that an omitted `models` becomes an empty map that shadows the bundle's own table, leaving the next turn asking the provider for a model nobody chose — and the example above it omitted exactly that.
The working indicator could name whoever the first live frame named, and nothing else. A receipt is client state: a reload throws it away, and the re-armed indicator had nothing left to say but a bare "Working…". The host now records who it expects to answer on the open-turn row, and serves it, so the reload leg has a name to show. It is optimistic exactly as the host's own row is — the brain may still pick a different seat, and the first frame of the resumed turn overwrites it. Absent from a host that does not record it, which reads as it did before. `mergeOpenTurns` folds a re-arm onto an existing row by spreading it, so the key is omitted rather than set to `undefined` when the host named nobody: a present-but-undefined key would erase a name the POST leg had already put there, where an absent one leaves it standing. Two tests cover it — that the indicator names the teammate, and that the reload leg keeps the name the live leg found.
Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (8)
🚧 Files skipped from review as they are similar to previous changes (2)
Included review availability: Your plan provides up to 2 included reviews per hour; 0 remain after this review. 📝 WalkthroughWalkthroughThe change adds continuous cross-channel agent sessions, speech tools, session inspection, private-aside rendering, inference-provider state reporting, durable onboarding dismissal, Chargebee invoicing surfaces, and updated retail desk handoff prompts. ChangesRuntime sessions and speech
Session API and console
Console configuration and finance
Retail configuration and documentation
Priority: ➖ Normal Estimated code review effort: 5 (Critical) | ~90 minutes Change: Feature · Severity of issue fixed: Medium Suggested reviewers: Merge Risk: 🟡 Moderate · up to Several unresolved defects affect newly added session, speech, and inference flows, including duplicated DMs on retry, incomplete conversation history, and stale configuration or agent state. These should be addressed before merge unless explicitly accepted. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 77.11% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 201 functions across 53 files. (2 skipped: 2 unsupported.) A rabbit hops through sessions bright Comment |
|
Final local run on the pushed tree: Built with Not covered locally: the frontend vitest suite, including the two new tests in this PR — CI is the first thing to actually run those. One late result worth recording, since it changes what the aside commit claims. I reseeded the tau2 database (an earlier run had left order #W2378156 stuck in Still no aside. The room coordinated the tool boundary in the open:
So that is eight attempts, one aside, unbidden. I read this as the mechanism behaving as designed rather than as a gap: The consequence for review: the collapsed-aside rendering is test-verified and not eyeball-verified, and the odds of it being exercised by an ordinary run are low. Reviewers should lean on |
An artifact of a local screenshot run that the auto-commit hook picked up; it was never part of any change here. Co-authored-by: Medulla <medulla@tinyhumans.ai>
Brings the inference managed-provider read-back fix, the Chargebee migration pitch on Finance -> Invoicing, and the durable onboarding-gate dismissal onto PR tinyhumansai#2247's cross-conversation-context branch, so both can be worked on together. No file is touched by both sides. Co-authored-by: Medulla <medulla@tinyhumans.ai>
Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a built-in agent session for the harness so agent runs can be driven through the standard built-in interface. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Switched the agent session to the shared GENERAL_DESK constant and the EventSeq::new constructor instead of local equivalents, and widened operator_label to pub(super) so it can be reused. No behaviour change. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add the agent_session module to the built-in harness so its watermark and channel identity cue block are available to callers. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
…aring The agent now keeps one continuous session across every chat it serves, receiving only the rows it has not yet seen, each cued with its origin channel, rather than clearing its history and re-seeding whenever the chat changes. Audience narrowing still applies, so private exchanges the agent is not party to remain out of reach, but channel isolation is deliberately dropped so the agent can carry context between Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a session field to CompanyAgent holding the agent session state, initialized at each construction site. The watermark is kept beside bound_chat rather than inside it so it survives a channel switch instead of being cleared and reseeded per chat. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
ChatSeedRequest now exposes session_delta, which walks the journal for rows the agent has not yet been handed across every channel it can read, returning None when the company record is unreadable so the caller leaves the session untouched. render_cues no longer takes an unused agent_id. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Inbound turns now carry their session cue block ahead of the message text, matching the reference implementation where inbound is a cued turn rather than a synthesised tool result. The text is borrowed when no cues are present, so ordinary same-channel replies pay nothing for the change. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Expose desk_post, desk_dm, desk_close and desk_read as tool calls whose names, argument shapes and descriptions come from tinyhivemind::speech. The module stays off unless the manifest enables [speech]. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The test agent builder now initializes an AgentSessionState so the constructed agent matches the current struct shape. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Speech tools now declare PermissionLevel::None instead of Safe, since speaking has no effect outside the company and the approval bridge classifies by tool name anyway; a turn that must ask permission to answer cannot answer. Peer validation in DmTool also now uses resolve_teammate_key so only genuinely unknown teammates are reported. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Add a `[speech]` section to the company manifest with an `enabled` flag that registers the desk speech tools on every agent's belt. The setting lives at the company level rather than per desk because speech is a property of an agent's continuous session, which spans every desk it sits on. It defaults to off and never silences an agent, since return text is still journaled when no speech tool is called. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Agents whose manifest sets `[speech] enabled` now get the speech belt registered alongside their other tools, gated on an event log being available since the tools are themselves the append. Without an event log the return-text path is kept, matching the fallback for an uncalled tool. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
build_agent now takes a speech_enabled bool instead of reading the manifest's speech block itself, so the caller resolves the flag once and the builder keeps a single source of truth. This follows the same precedent as is_orchestrator, which already arrives pre-decided. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The agent constructor now receives the company's speech.enabled setting, which was previously not forwarded from the manifest. This ensures agents are built with the correct speech configuration instead of relying on a default. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The speech tool harness was silently dropping output from the speech synthesis pipeline, causing tests to pass without verifying actual audio generation. This change re-enables output capture so the harness can properly assert on synthesized speech content. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Prevents a panic when the speech synthesis function receives an empty string by returning an early error instead of attempting to process the input. This ensures robust behavior for edge cases where no text is provided. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The episode metadata fields were inadvertently dropped during a previous refactor, causing downstream consumers to lose access to episode-level information. This change restores the metadata struct and its associated accessor methods, ensuring the episode API remains backward compatible. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 42cfacbe6e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The speech tool output was previously being discarded, which prevented downstream components from receiving the generated speech data. This change re-enables the output propagation so that speech results flow correctly through the harness pipeline. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Reformat the `collides_with_desk` boolean expression to break the chained iterator calls across multiple lines, improving code readability without changing any behaviour. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e8cb17e226
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Introduce a built-in agent session for the harness so sessions can be driven directly from the runtime. This provides the foundation for running agent interactions without an external driver. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
Introduce a built-in agent session for the harness so sessions can be driven directly from the runtime. This provides the foundation for running agent interactions without an external driver. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
The speech tool output capture was previously removed, which broke the ability to verify spoken responses in tests. This change restores the capture mechanism so that speech output can be properly asserted against expected values. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f7cd1438e9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
The build script was previously removed but is needed again to generate the test harness for built-in tests. This restores the functionality so the build process can properly compile and link the test binaries. Auto-committed-on: macbook Co-authored-by: Medulla <medulla@tinyhumans.ai>
# Conflicts: # frontend/src/views/connections/InferenceSection.tsx # src/company/inference.rs # src/server/ops/inference.rs # tests/auth_matrix.rs
A bare direct-line target is only safe when it cannot also name a declared desk, since `addresses_desk` accepts either spelling and querying the bare id for an unrelated desk with the same id/name would leak that desk's rows into the agent's prompt. The change adds a safety check that omits the bare target when a collision exists, relying on the prefixed spelling used elsewhere for DMs written after the guard. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The closing brace of the `credential_slug` function was misaligned, causing a formatting inconsistency. This change corrects the indentation to match the surrounding code style. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Update the locked version of the syn crate from 3.0.3 to 3.0.4 across three dependency entries in Cargo.lock, reflecting a patch-level dependency resolution change. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The inference e2e test was previously removed, but it is now restored to ensure the inference flow remains covered by end-to-end testing. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The test file for the managed inference round trip has been deleted. This test was redundant as the same behavior is already covered by the end-to-end test in `inference.spec.ts`, which validates the round trip against a real host. Removing this duplicate unit test reduces maintenance overhead while preserving coverage of the managed route behavior. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
The inference declaration now includes the selected provider kind alongside the normalized provider name, preserving the original provider selection for cases where normalization changes the value. This ensures downstream consumers can distinguish between the normalized and originally selected providers. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: c0d540c5ee
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| assert_eq!( | ||
| resp["status"]["slug"], "openrouter", | ||
| "attribution follows the endpoint, not the label" | ||
| ); |
There was a problem hiding this comment.
Remove the contradictory managed-slug assertion
In a_legacy_managed_key_can_be_set_rotated_and_cleared, this assertion requires the response slug to be openrouter, but the same unchanged response is required to be subscription at line 2981. No implementation can satisfy both, so the test always panics and blocks the test suite; retain only the expectation matching the intended billing contract.
Useful? React with 👍 / 👎.
| provider: d.selected_provider().to_string(), | ||
| proxied: d.is_proxied(), | ||
| slug: d.telemetry_slug().to_string(), |
There was a problem hiding this comment.
Report keyed managed configurations as non-proxied
When an operator saves provider: "managed" with an explicit tenant key, resolve_endpoint still sets proxied to true unconditionally for the managed branch, so this newly exposed field reports that the subscription pays and telemetry_slug() returns subscription. That contradicts the field contract and the newly added keyed-managed expectation that the tenant's own key takes the configuration off the subscription; derive proxy status from whether the managed credential was inherited rather than forwarding this value unchanged.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Requesting changes: 1 lane(s) blocking, worst finding is high.
Fix or reply to the findings below and push. The next review clears this automatically once they are gone — you should not need to dismiss anything by hand.
$0.2840 · 2,522,772 in / 77,769 out · 427,440 cached (17%) · openrouter/openai/text-embedding-3-small, deepseek/deepseek-v4-flash, z-ai/glm-5.2 · 785 embedded
critique: $0.1007 · 1,094,266 in / 21,206 out · 35,353 cached (3%) · deepseek/deepseek-v4-flash, z-ai/glm-5.2
security: $0.1208 · 936,805 in / 24,751 out · 116,721 cached (12%) · deepseek/deepseek-v4-flash, z-ai/glm-5.2
tests: $0.0506 · 336,548 in / 31,290 out · 275,366 cached (82%) · z-ai/glm-5.2
description: $0.0119 · 155,153 in / 522 out · 0 cached (0%) · deepseek/deepseek-v4-flash
Draft. Six commits, each readable on its own.
The vision this follows
An agent's context is a pure function of
(turn, transcript)— rebuilt fromthe log every turn, never accumulated in the agent. That is what lets an episode
replay byte-for-byte, and it is the property every change here is careful not to
spend.
Around it sits one invariant, which tinyhivemind states three times in three
mechanisms and which this PR states a fourth time: information crosses a
boundary, support never does. An aside "carries information and never
support". A referral's answer "is not a vote, and it supports nothing here until
one of us spends a line on it". A digest "deposits information into every reader
and support into nobody's standings". The cross-conversation context added here
is the fourth instance — a seat may read and quote what it said elsewhere, and
nothing it reads there can move an option towards a decision here.
That invariant is why a desk stays a correlation boundary. Members of one
desk read the same transcript and are wrong about the same things; pooling two
desks that share an error imports it rather than cancelling it. The benchmark
measures the cliff — a bounded ask holds 95% at twenty-five desks and collapses
to 0.0% at a hundred once the peer pool shares the asking desk's blind spot.
Facts may cross. Conclusions may not.
What is done
39fc6d7867e3ec49d59dc305triageonreturnsa2a0387b@#id, route on order statusa089fa643c854e2eCross-conversation context. Every other desk a seat sits on, plus its own
direct line, projected as the speaker and kept out of the fold. The desk it is
deliberating on is deliberately excluded — that comes from
project_for,because loading it in full would re-insert the peer rows a blind round withheld
while quorum kept counting as though independence held.
Aside folding. A private line reached the operator's transcript verbatim,
!aside @refundsand all, addressed to a room it was never addressed to. Nowlifted out and collapsed onto its author's move, rendered as
ReferralConversation's sibling. The collapse means something different from areferral's, and the doc comment says so: a referral's rows are dropped
host-side, so expanding is the only way to read them; an aside is withheld from
agents and never from a person, so expanding reveals nothing the reader was
not already entitled to.
Desk addressing. Three silent failures — a bare
@returnsresolving tonobody, two seats naming their own desk (a self-referral, refused without an
error), and the block promising a referral was a deliberation when it is one
turn.
The pin bump crosses ADR 0011:
HiveStep::Speakcarries a round ratherthan a turn, and
HiveTurntradesnext_stateforwatermark+round_start.The widths are pinned, not inherited —
EpisodePolicy::DEFAULTcarriesround_width = 4upstream and this host spreads that default, so the bump wouldotherwise have adopted four concurrent speakers in the opening blind round
without a line of code saying so, with
spentadvancing by the round's width. At1 the
round_startclause is inert and upstream states a round of one isbit-identical, which makes the bump verifiable against a baseline rather than a
guess. A wider round is refused with an error naming
round_width, becausenext_statemay only be adopted once every turn in the round has landed andwhat a half-failed round does to the budget is not answered by the existing
failure cap.
No
Cargo.lockchurn — both locks unchanged,--lockedpasses, crates stay at0.2.1.Verified
clippyclean,tsc --noEmitcleanDB PASSon the rebuilt binary — with asides off, with asides on, and with three seats@exchangesdeliberating on Company Line, shown#returns (Returns and Exchanges)carrying the real task rows, its own line marked(you), sequence numbers preserved!asidein any live transcript after the foldWhat is NOT verified
The aside chip has never been seen in a browser. The path is proven by
an_aside_reaches_the_operator_as_a_collapsed_conversation, which drives a realepisode and asserts the folded result — but no live run has produced an aside
since the renderer was written. Across eight attempts, including a reseeded
database and a task neither seat could finish alone, exactly one seat wrote an
aside, unbidden. Rooms coordinate in the open, which is what
must_surfaceandthe prompt both push them towards. Treat the rendering as test-verified, not
eyeball-verified.
The frontend vitest suite has not run locally, including the two new tests
here. CI is the first thing to execute them.
For whoever picks this up
tau2-up.shwipes the rig home butnot
opencompany-tau2/.state/retail.json, so every run after the first scoresagainst a database earlier runs mutated. This bit us mid-session: a room spent
its whole budget on an order already stuck in
exchange requested.tau2-up.shcan silently select the wrong binary. Two runs used adifferent target directory with
OC_BINandCARGO_TARGET_DIRboth unset, andthe resolution was not reproducible. Pass
OC_BINexplicitly until it is.Your direct line (@id)is probably the wrong label. It reads as theagent's private line; it is specifically what people said to that agent.
Agent-to-agent traffic never gets its own conversation.
triagestays onreturns. Added to make asides likelier;it did not. It changes the bundle's shape — three seats against
quorum = 2onthe same twelve-turn budget.
#yes-i) andburns turns restating a settled decision. Pre-existing, visible in every run.
the bump refuses to guess at.
Summary by CodeRabbit
New Features
Improvements